home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 431_01 / crc32.asm < prev    next >
Encoding:
Assembly Source File  |  1994-05-31  |  4.8 KB  |  140 lines

  1. ;----------------------------------------------------------------------
  2. ;----------------------------------------------------------------------
  3. ;
  4. ; this is coded in assembly for speed. roughly 25K/sec on an 8088
  5. ; from the comp.compression FAQ
  6. ;
  7. ;----------------------------------------------------------------------
  8. ;----------------------------------------------------------------------
  9. CRC_TEXT        segment byte public 'CODE'
  10. DGROUP  group   _DATA,_BSS
  11.         assume  cs:CRC_TEXT,ds:DGROUP
  12. CRC_TEXT        ends
  13. _DATA   segment word public 'DATA'
  14. d@      label   byte
  15. d@w     label   word
  16.  
  17.  
  18. _crc32_table dd    000000000h, 004c11db7h, 009823b6eh, 00d4326d9h
  19.     dd    0130476dch, 017c56b6bh, 01a864db2h, 01e475005h
  20.     dd    02608edb8h, 022c9f00fh, 02f8ad6d6h, 02b4bcb61h
  21.     dd    0350c9b64h, 031cd86d3h, 03c8ea00ah, 0384fbdbdh
  22.     dd    04c11db70h, 048d0c6c7h, 04593e01eh, 04152fda9h
  23.     dd    05f15adach, 05bd4b01bh, 0569796c2h, 052568b75h
  24.     dd    06a1936c8h, 06ed82b7fh, 0639b0da6h, 0675a1011h
  25.     dd    0791d4014h, 07ddc5da3h, 0709f7b7ah, 0745e66cdh
  26.     dd    09823b6e0h, 09ce2ab57h, 091a18d8eh, 095609039h
  27.     dd    08b27c03ch, 08fe6dd8bh, 082a5fb52h, 08664e6e5h
  28.     dd    0be2b5b58h, 0baea46efh, 0b7a96036h, 0b3687d81h
  29.     dd    0ad2f2d84h, 0a9ee3033h, 0a4ad16eah, 0a06c0b5dh
  30.     dd    0d4326d90h, 0d0f37027h, 0ddb056feh, 0d9714b49h
  31.     dd    0c7361b4ch, 0c3f706fbh, 0ceb42022h, 0ca753d95h
  32.     dd    0f23a8028h, 0f6fb9d9fh, 0fbb8bb46h, 0ff79a6f1h
  33.     dd    0e13ef6f4h, 0e5ffeb43h, 0e8bccd9ah, 0ec7dd02dh
  34.     dd    034867077h, 030476dc0h, 03d044b19h, 039c556aeh
  35.     dd    0278206abh, 023431b1ch, 02e003dc5h, 02ac12072h
  36.     dd    0128e9dcfh, 0164f8078h, 01b0ca6a1h, 01fcdbb16h
  37.     dd    0018aeb13h, 0054bf6a4h, 00808d07dh, 00cc9cdcah
  38.     dd    07897ab07h, 07c56b6b0h, 071159069h, 075d48ddeh
  39.     dd    06b93dddbh, 06f52c06ch, 06211e6b5h, 066d0fb02h
  40.     dd    05e9f46bfh, 05a5e5b08h, 0571d7dd1h, 053dc6066h
  41.     dd    04d9b3063h, 0495a2dd4h, 044190b0dh, 040d816bah
  42.     dd    0aca5c697h, 0a864db20h, 0a527fdf9h, 0a1e6e04eh
  43.     dd    0bfa1b04bh, 0bb60adfch, 0b6238b25h, 0b2e29692h
  44.     dd    08aad2b2fh, 08e6c3698h, 0832f1041h, 087ee0df6h
  45.     dd    099a95df3h, 09d684044h, 0902b669dh, 094ea7b2ah
  46.     dd    0e0b41de7h, 0e4750050h, 0e9362689h, 0edf73b3eh
  47.     dd    0f3b06b3bh, 0f771768ch, 0fa325055h, 0fef34de2h
  48.     dd    0c6bcf05fh, 0c27dede8h, 0cf3ecb31h, 0cbffd686h
  49.     dd    0d5b88683h, 0d1799b34h, 0dc3abdedh, 0d8fba05ah
  50.     dd    0690ce0eeh, 06dcdfd59h, 0608edb80h, 0644fc637h
  51.     dd    07a089632h, 07ec98b85h, 0738aad5ch, 0774bb0ebh
  52.     dd    04f040d56h, 04bc510e1h, 046863638h, 042472b8fh
  53.     dd    05c007b8ah, 058c1663dh, 0558240e4h, 051435d53h
  54.     dd    0251d3b9eh, 021dc2629h, 02c9f00f0h, 0285e1d47h
  55.     dd    036194d42h, 032d850f5h, 03f9b762ch, 03b5a6b9bh
  56.     dd    00315d626h, 007d4cb91h, 00a97ed48h, 00e56f0ffh
  57.     dd    01011a0fah, 014d0bd4dh, 019939b94h, 01d528623h
  58.     dd    0f12f560eh, 0f5ee4bb9h, 0f8ad6d60h, 0fc6c70d7h
  59.     dd    0e22b20d2h, 0e6ea3d65h, 0eba91bbch, 0ef68060bh
  60.     dd    0d727bbb6h, 0d3e6a601h, 0dea580d8h, 0da649d6fh
  61.     dd    0c423cd6ah, 0c0e2d0ddh, 0cda1f604h, 0c960ebb3h
  62.     dd    0bd3e8d7eh, 0b9ff90c9h, 0b4bcb610h, 0b07daba7h
  63.     dd    0ae3afba2h, 0aafbe615h, 0a7b8c0cch, 0a379dd7bh
  64.     dd    09b3660c6h, 09ff77d71h, 092b45ba8h, 09675461fh
  65.     dd    08832161ah, 08cf30badh, 081b02d74h, 0857130c3h
  66.     dd    05d8a9099h, 0594b8d2eh, 05408abf7h, 050c9b640h
  67.     dd    04e8ee645h, 04a4ffbf2h, 0470cdd2bh, 043cdc09ch
  68.     dd    07b827d21h, 07f436096h, 07200464fh, 076c15bf8h
  69.     dd    068860bfdh, 06c47164ah, 061043093h, 065c52d24h
  70.     dd    0119b4be9h, 0155a565eh, 018197087h, 01cd86d30h
  71.     dd    0029f3d35h, 0065e2082h, 00b1d065bh, 00fdc1bech
  72.     dd    03793a651h, 03352bbe6h, 03e119d3fh, 03ad08088h
  73.     dd    02497d08dh, 02056cd3ah, 02d15ebe3h, 029d4f654h
  74.     dd    0c5a92679h, 0c1683bceh, 0cc2b1d17h, 0c8ea00a0h
  75.     dd    0d6ad50a5h, 0d26c4d12h, 0df2f6bcbh, 0dbee767ch
  76.     dd    0e3a1cbc1h, 0e760d676h, 0ea23f0afh, 0eee2ed18h
  77.     dd    0f0a5bd1dh, 0f464a0aah, 0f9278673h, 0fde69bc4h
  78.     dd    089b8fd09h, 08d79e0beh, 0803ac667h, 084fbdbd0h
  79.     dd    09abc8bd5h, 09e7d9662h, 0933eb0bbh, 097ffad0ch
  80.     dd    0afb010b1h, 0ab710d06h, 0a6322bdfh, 0a2f33668h
  81.     dd    0bcb4666dh, 0b8757bdah, 0b5365d03h, 0b1f740b4h
  82.  
  83. _DATA   ends
  84. _BSS    segment word public 'BSS'
  85. b@      label   byte
  86. b@w     label   word
  87. _BSS    ends
  88.  
  89. CRC_TEXT        segment byte public 'CODE'
  90.  
  91. public  _crc32
  92.  
  93. ;
  94. ; DWORD crc32(DWORD crc, void *buf, WORD length)
  95. ;   initial crc = 0xffffffff 
  96. ;
  97. _crc32  proc    far
  98.         push    bp
  99.         mov     bp,sp
  100.         push    di
  101.         push    si
  102.  
  103.     mov    di,[bp+ 6]    ; dx:di = CRC accum
  104.     mov    dx,[bp+ 8]
  105.     not    di
  106.     not    dx
  107.     les    si,[bp+10]    ; es:si --> buffer
  108.     mov    cx,[bp+14]    ; cx = length
  109.     cld
  110. @@top:
  111.     mov    bl,dh        ; bx = dx:di >> 24
  112.     mov    bh,0
  113.     db    26h        ; ES: (segment override)
  114.     lodsb            ; al = es:[si]; si++
  115.     xor    bl,al        ; bx ^= al
  116.     add    bx,bx        ; 
  117.     add    bx,bx
  118.     add    bx, offset _crc32_table
  119.     mov    ax,di
  120.     mov    dh,dl
  121.     mov    dl,ah
  122.     mov    ah,al
  123.     mov    al,0
  124.     xor    ax,[bx]
  125.     xor    dx,[bx+2]
  126.     mov    di,ax
  127.     loop    @@top
  128.     mov    ax,di
  129.     not    ax
  130.     not    dx
  131.         pop    si
  132.         pop    di
  133.         mov     sp,bp
  134.         pop     bp
  135.         ret     
  136. _crc32  endp
  137.  
  138. CRC_TEXT        ends
  139.         end
  140.